package com.me.factory.simplefactory.pizzastore.order;

import com.me.factory.simplefactory.pizzastore.pizza.Pizza;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

/**
 * @author inttom
 * @date 2022/2/15
 */
public class OrderPizza {
    /**
     * 构造器
     * 这种写法好理解，但是如果需要加个其他种类的Pizza就需要再do代码块中随之改动，违反了ocp原则（对扩展开放，对修改关闭）
     * 改进分析：如果Pizza对象被多处调用，那么需要修改的代码会更多
     * 改进思路：把创建Pizza对象封装到一个类中，当有新的Pizza种类时，只需要修改该类就可，其他的有使用到Pizza对象的代码就不需要修改了
     * 这就是简单工厂模式，它是创建型模式，是工厂模式的一种，简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例，简单工厂模式是工厂模式中最简单且实用的模式
     * 概念: 定义一个创建对象的类，由这个类来管理、封装实例化对象的行为（代码）
     * 在软件开发中，当用到大量的创建某种、某类或者某批对象的时候，就会使用工厂模式
     */
//    public OrderPizza() {
//        Pizza pizza = null;
//        String orderType;
//
//        do {
//            orderType = getType();
//            if ("greek".equals(orderType)) {
//                pizza = new GreekPizza();
//                pizza.setName("希腊披萨");
//            } else if ("cheese".equals(orderType)) {
//                pizza = new CheesePizza();
//                pizza.setName("奶酪披萨");
//            } else if ("pepper".equals(orderType)) {
//                pizza = new PepperPizza();
//                pizza.setName("胡椒披萨");
//            } else {
//                break;
//            }
//            //输出pizza 制作过程
//            pizza.prepare();
//            pizza.bake();
//            pizza.cut();
//            pizza.box();
//        } while (true);
//    }


    /**
     * 定义一个简单工厂对象
     */
    SimpleFactory simpleFactory;
    Pizza pizza = null;

    /**
     * 构造器
     */
    public OrderPizza(SimpleFactory simpleFactory) {
        setFactory(simpleFactory);
    }

    /**
     * 简单工厂模式也称为静态工厂模式
     *
     * @param simpleFactory 工厂模式
     */
    private void setFactory(SimpleFactory simpleFactory) {
        // 用户输入的
        String orderType = "";
        // 设置简单工厂对象
        this.simpleFactory = simpleFactory;

        do {
            orderType = getType();
            pizza = this.simpleFactory.createPizza(orderType);
            // 输出pizza
            if (pizza != null) {
                // 订购成功
                pizza.prepare();
                pizza.bake();
                pizza.cut();
                pizza.box();
            } else {
                System.out.println("披萨订购失败");
                break;
            }
        } while (true);
    }

    /**
     * 写一个方法，可以获取客户希望订购的披萨种类
     *
     * @return 用户输入的数据
     */
    private String getType() {
        try {
            BufferedReader strIn = new BufferedReader(new InputStreamReader(System.in));
            System.out.println("input pizza 种类:" + strIn.readLine());
            return strIn.readLine();
        } catch (IOException e) {
            e.printStackTrace();
            return "";
        }
    }
}